<?php


namespace App\Service;


class Dir
{

    /**
     * 循环创建文件夹
     * @param string $dir 需要创建的文件夹路径
     * @param integer $mode 文件夹权限
     * @return bool          返回创建是否成功
     */
    public function makeDir($dir, $mode = 0777)
    {
        if(is_dir($dir)){
            return true;
        }/* elseif(!is_dir(dirname($dir)) && !call_user_func([$this, __FUNCTION__], dirname($dir), $mode)){
            return false;
        }*/

        // 修改所有者和权限
        //  避免 mkdir 没有权限
        if(strtoupper(PHP_OS) == 'LINUX'){
            // 在这里执行 Linux 特定的操作
            //var_dump(PHP_OS);
            // 未开启 exec 函数
            //exec("chown -R www:www ".$dir);
            //exec("chown -R www:www ".app()->basePath());
        }

        // exec("chown newuser:newgroup /path/to/directory");
        $res = mkdir($dir, $mode, true);

        // 修改所有者和权限
        if(strtoupper(PHP_OS) == 'LINUX'){
            // 在这里执行 Linux 特定的操作
            //var_dump(PHP_OS);
            // 未开启 exec 函数
            //exec("chown -R www:www ".$dir);
            //exec("chown -R www:www ".app()->basePath());
        }

        return $res;
    }

    /**
     * 删除目录
     * @param string $path
     * @param string $isCurrent 是否删除当前目录
     * @return bool
     */
    public function delDir(string $path, bool $isCurrent = false):bool
    {
        if(!is_dir($path)){
            return false;
        }
        $open = opendir($path);
        if(!$open){
            return false;
        }
        while(($v = readdir($open)) !== false){
            if('.' == $v || '..' == $v){
                continue;
            }
            $item = $path.'/'.$v;
            if(is_file($item)){
                unlink($item);
                continue;
            }
            // 继续删除下级目录(并删除下级目录的主目录)
            $this->delDir($item, true);
        }
        closedir($open);

        if($isCurrent){
            return rmdir($path);
        } else{
            return true;
        }
    }

    /**
     * 读取目录
     * @param string $path
     */
    public function readDir(string $path)
    {
        $result = [];
        if(!is_dir($path)){
            return $result;
        }
        $open = opendir($path);
        if(!$open){
            return $result;
        }
        while(($v = readdir($open)) !== false){
            if('.' == $v || '..' == $v){
                continue;
            }
            $item = $path.'/'.$v;
            if(is_file($item)){
                //$result[$path][] = $item;
                $result[] = $item;
                continue;
            }
            // 继续读取下级目录
            //$result[$path][] = $this->readDir($item);
            $result[] = $this->readDir($item);
        }

        closedir($open);

        return $result;
    }
}


